package com.webank.openledger.contracts;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.Utils;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.DynamicBytes;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.Bytes32;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class AuthCenter extends Contract {
    public static final String[] BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c69630000000000000000000000000000000000000000000000000000815250600090805190602001906200005192919062000efc565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f92919062000efc565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed92919062000efc565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b92919062000efc565b506040805190810160405280600281526020017f5f77000000000000000000000000000000000000000000000000000000000000815250600490805190602001906200018992919062000efc565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d792919062000efc565b506040805190810160405280600281526020017f6964000000000000000000000000000000000000000000000000000000000000815250600690805190602001906200022592919062000efc565b506040805190810160405280600481526020017f6164647200000000000000000000000000000000000000000000000000000000815250600790805190602001906200027392919062000efc565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c192919062000efc565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f92919062000efc565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d92919062000efc565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab92919062000efc565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f992919062000efc565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d90805190602001906200044792919062000efc565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e90805190602001906200049592919062000efc565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e392919062000efc565b506040805190810160405280600781526020017f62616c616e636500000000000000000000000000000000000000000000000000815250601090805190602001906200053192919062000efc565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f92919062000efc565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd92919062000efc565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b92919062000efc565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250601490805190602001906200066992919062000efc565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b792919062000efc565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b50604051604080620065b68339810180604052620007f7919081019062001111565b33601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a1c600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620009585780601f106200092c5761010080835404028352916020019162000958565b820191906000526020600020905b8154815290600101906020018083116200093a57829003601f168201915b505050505060008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620009f75780601f10620009cb57610100808354040283529160200191620009f7565b820191906000526020600020905b815481529060010190602001808311620009d957829003601f168201915b5050505050601d62000b88640100000000026200340217909291906401000000009004565b5062000b7f600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562000abb5780601f1062000a8f5761010080835404028352916020019162000abb565b820191906000526020600020905b81548152906001019060200180831162000a9d57829003601f168201915b505050505060028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562000b5a5780601f1062000b2e5761010080835404028352916020019162000b5a565b820191906000526020600020905b81548152906001019060200180831162000b3c57829003601f168201915b5050505050601d62000b88640100000000026200340217909291906401000000009004565b5050506200138a565b60008084600001846040518082805190602001908083835b60208310151562000bc7578051825260208201915060208101905060208303925062000ba0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000d84577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000ca0578051825260208201915060208101905060208303925062000c79565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000ce995949392919062001269565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000d2e578051825260208201915060208101905060208303925062000d07565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000d7992919062000f83565b506001915062000ef4565b8285600001856040518082805190602001908083835b60208310151562000dc1578051825260208201915060208101905060208303925062000d9a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000e0c92919062000f83565b5084600101805480919060010162000e2591906200100a565b90506001810185600001856040518082805190602001908083835b60208310151562000e67578051825260208201915060208101905060208303925062000e40565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000018190555083856001018281548110151562000eb457fe5b9060005260206000209060020201600001908051906020019062000eda92919062000f83565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000f3f57805160ff191683800117855562000f70565b8280016001018555821562000f70579182015b8281111562000f6f57825182559160200191906001019062000f52565b5b50905062000f7f91906200103f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000fc657805160ff191683800117855562000ff7565b8280016001018555821562000ff7579182015b8281111562000ff657825182559160200191906001019062000fd9565b5b5090506200100691","906200103f565b5090565b8154818355818111156200103a5760020281600202836000526020600020918201910162001039919062001067565b5b505050565b6200106491905b808211156200106057600081600090555060010162001046565b5090565b90565b620010ac91905b80821115620010a857600080820160006200108a9190620010af565b6001820160006101000a81549060ff0219169055506002016200106e565b5090565b90565b50805460018160011615610100020316600290046000825580601f10620010d75750620010f8565b601f016020900490600052602060002090810190620010f791906200103f565b5b50565b600062001109825162001323565b905092915050565b600080604083850312156200112557600080fd5b60006200113585828601620010fb565b92505060206200114885828601620010fb565b9150509250929050565b6200115d8162001303565b82525050565b60006200117082620012f8565b8084526200118681602086016020860162001343565b620011918162001379565b602085010191505092915050565b6000620011ac82620012ed565b808452620011c281602086016020860162001343565b620011cd8162001379565b602085010191505092915050565b600081546001811660008114620011fb57600181146200121c5762001261565b607f600283041680865260ff19831660208701526040860193505062001261565b600282048086526020860195506200123485620012db565b60005b82811015620012585781548189015260018201915060208101905062001237565b80880195505050505b505092915050565b600060a08201905062001280600083018862001152565b6200128f602083018762001152565b8181036040830152620012a381866200119f565b90508181036060830152620012b9818562001163565b90508181036080830152620012cf8184620011db565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200136357808201518184015260208101905062001346565b8381111562001373576000848401525b50505050565b6000601f19601f8301169050919050565b61521c806200139a6000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301db8d89146101f357806303ba71eb1461021e5780630754afd014610249578063081f9339146102765780630c0fd886146102a1578063117803e3146102cc57806315e9977e146102f757806323a772bd14610322578063283d26ca1461034d5780632a0acc6a146103785780632ef8cb1c146103a357806337258c0d146103ce578063391517531461040b5780633a0e61741461043657806353c4035e1461046157806357872d131461049e578063632e1dfe146104c957806369921c26146104f4578063699cc7f1146105315780636adc41651461055c57806381ddca191461058757806381e167cf146105c4578063893d20e8146105ef578063983d27371461061a5780639d53fe2b14610645578063accfbdd914610670578063b11569f5146106ae578063b3032be8146106d9578063b3cea21714610704578063b4eb5ede1461072f578063b73c40501461075a578063b85a290114610797578063bb1239c3146107c2578063bb24fe8a146107ed578063c04d4ef314610818578063c55fc52d14610856578063d24bfcf314610881578063e696f175146108be578063f307b32c146108fb578063f79e3c0a14610926575b600080fd5b3480156101ff57600080fd5b50610208610964565b6040516102159190614f41565b60405180910390f35b34801561022a57600080fd5b50610233610a02565b6040516102409190614f41565b60405180910390f35b34801561025557600080fd5b5061025e610aa0565b60405161026d93929190614e9c565b60405180910390f35b34801561028257600080fd5b5061028b610aba565b6040516102989190614f41565b60405180910390f35b3480156102ad57600080fd5b506102b6610b58565b6040516102c39190614f41565b60405180910390f35b3480156102d857600080fd5b506102e1610bf6565b6040516102ee9190614f41565b60405180910390f35b34801561030357600080fd5b5061030c610c94565b6040516103199190614f41565b60405180910390f35b34801561032e57600080fd5b50610337610d32565b6040516103449190614f41565b60405180910390f35b34801561035957600080fd5b50610362610dd0565b60405161036f9190614f41565b60405180910390f35b34801561038457600080fd5b5061038d610e6e565b60405161039a9190614f41565b60405180910390f35b3480156103af57600080fd5b506103b8610f0c565b6040516103c59190614f41565b60405180910390f35b3480156103da57600080fd5b506103f560048036036103f0919081019061469b565b610faa565b6040516104029190614ee1565b60405180910390f35b34801561041757600080fd5b5061042061174d565b60405161042d9190614f41565b60405180910390f35b34801561044257600080fd5b5061044b6117eb565b6040516104589190614f41565b60405180910390f35b34801561046d57600080fd5b5061048860048036036104839190810190614649565b611889565b6040516104959190614fe1565b60405180910390f35b3480156104aa57600080fd5b506104b3611aca565b6040516104c09190614f41565b60405180910390f35b3480156104d557600080fd5b506104de611b68565b6040516104eb9190614c7b565b60405180910390f35b34801561050057600080fd5b5061051b60048036036105169190810190614649565b611b8e565b6040516105289190614ee1565b60405180910390f35b34801561053d57600080fd5b50610546611d2f565b6040516105539190614f41565b60405180910390f35b34801561056857600080fd5b50610571611dcd565b60405161057e9190614c7b565b60405180910390f35b34801561059357600080fd5b506105ae60048036036105a99190810190614989565b611df3565b6040516105bb9190614ee1565b60405180910390f35b3480156105d057600080fd5b506105d9611eb9565b6040516105e69190614f41565b60405180910390f35b3480156105fb57600080fd5b50610604611f57565b6040516106119190614c7b565b60405180910390f35b34801561062657600080fd5b5061062f611f81565b60405161063c9190614f41565b60405180910390f35b34801561065157600080fd5b5061065a61201f565b6040516106679190614f41565b60405180910390f35b34801561067c57600080fd5b5061069760048036036106929190810190614649565b6120bd565b6040516106a5929190614de2565b60405180910390f35b3480156106ba57600080fd5b506106c3612265565b6040516106d09190614c7b565b60405180910390f35b3480156106e557600080fd5b506106ee61228b565b6040516106fb9190614c7b565b60405180910390f35b34801561071057600080fd5b506107196122b5565b6040516107269190614f41565b60405180910390f35b34801561073b57600080fd5b50610744612353565b6040516107519190614f41565b60405180910390f35b34801561076657600080fd5b50610781600480360361077c91908101906148e1565b6123f1565b60405161078e9190614ee1565b60405180910390f35b3480156107a357600080fd5b506107ac6124b4565b6040516107b99190614f41565b60405180910390f35b3480156107ce57600080fd5b506107d7612552565b6040516107e49190614c7b565b60405180910390f35b3480156107f957600080fd5b50610802612578565b60405161080f9190614f41565b60405180910390f35b34801561082457600080fd5b5061083f600480360361083a919081019061477d565b612616565b60405161084d929190614de2565b60405180910390f35b34801561086257600080fd5b5061086b61281e565b6040516108789190614c7b565b60405180910390f35b34801561088d57600080fd5b506108a860048036036108a39190810190614922565b612848565b6040516108b59190614ee1565b60405180910390f35b3480156108ca57600080fd5b506108e560048036036108e09190810190614716565b61294d565b6040516108f29190614ee1565b60405180910390f35b34801561090757600080fd5b5061091061301a565b60405161091d9190614f41565b60405180910390f35b34801561093257600080fd5b5061094d60048036036109489190810190614825565b6130b8565b60405161095b929190614de2565b60405180910390f35b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109fa5780601f106109cf576101008083540402835291602001916109fa565b820191906000526020600020905b8154815290600101906020018083116109dd57829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b505050505081565b6060806000610aaf601d6132bd565b925092509250909192565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b505780601f10610b2557610100808354040283529160200191610b50565b820191906000526020600020905b815481529060010190602001808311610b3357829003601f168201915b505050505081565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bee5780601f10610bc357610100808354040283529160200191610bee565b820191906000526020600020905b815481529060010190602001808311610bd157829003601f168201915b505050505081565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b82019190","6000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d2a5780601f10610cff57610100808354040283529160200191610d2a565b820191906000526020600020905b815481529060010190602001808311610d0d57829003601f168201915b505050505081565b60118054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dc85780601f10610d9d57610100808354040283529160200191610dc8565b820191906000526020600020905b815481529060010190602001808311610dab57829003601f168201915b505050505081565b600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e665780601f10610e3b57610100808354040283529160200191610e66565b820191906000526020600020905b815481529060010190602001808311610e4957829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b505050505081565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fa25780601f10610f7757610100808354040283529160200191610fa2565b820191906000526020600020905b815481529060010190602001808311610f8557829003601f168201915b505050505081565b6000606060008060008060008073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061101c5750600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16145b80611028575060008851145b15611036576000965061173f565b61104a88601d6132ef90919063ffffffff16565b95506000865114156111155761110460058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ef5780601f106110c4576101008083540402835291602001916110ef565b820191906000526020600020905b8154815290600101906020018083116110d257829003601f168201915b5050505050601d6132ef90919063ffffffff16565b9550600086511415611114578795505b5b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16141561117357601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694506115cb565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e0168c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016111ea9190614c7b565b602060405180830381600087803b15801561120457600080fd5b505af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061123c9190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff161415156115c6578291508173ffffffffffffffffffffffffffffffffffffffff16633bc5de306040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156112c557600080fd5b505af11580156112d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112fd9190810190614672565b73ffffffffffffffffffffffffffffffffffffffff16635262e2a16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113989190810190614672565b9350601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508373ffffffffffffffffffffffffffffffffffffffff1663357a9e0b846040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016114149190614c7b565b602060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061146691908101906148b8565b1561149557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694506115c1565b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061159557508873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16633bc5de306040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561154557600080fd5b505af1158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157d9190810190614672565b73ffffffffffffffffffffffffffffffffffffffff16145b156115c057601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b5b6115ca565b8a94505b5b7f8a16141a1c2a81d8195460d0c64567dab6fff6860f6bf2a02c82941b09e655498b858b8d8c604051611602959493929190614c96565b60405180910390a1856040518082805190602001908083835b602083101515611640578051825260208201915060208101905060208303925061161b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3a269398b83886040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016116ea93929190614e0b565b602060405180830381600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061173c91908101906148b8565b96505b505050505050949350505050565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117e35780601f106117b8576101008083540402835291602001916117e3565b820191906000526020600020905b8154815290600101906020018083116117c657829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118815780601f1061185657610100808354040283529160200191611881565b820191906000526020600020905b81548152906001019060200180831161186457829003601f168201915b505050505081565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016119069190614c7b565b602060405180830381600087803b15801561192057600080fd5b505af1158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119589190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff1614156119825760009350611ac2565b8291508173ffffffffffffffffffffffffffffffffffffffff16633bc5de306040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156119e957600080fd5b505af11580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a219190810190614672565b90508073ffffffffffffffffffffffffffffffffffffffff1663d087d2886040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611a8757600080fd5b505af1158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611abf91908101906149f5565b93505b505050919050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b605780601f10611b3557610100808354040283529160200191611b60565b820191906000526020600020905b815481529060010190602001808311611b4357829003601f168201915b505050505081565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611c0a9190614c7b565b602060405180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c5c9190810190614672565b915060008273ffffff","ffffffffffffffffffffffffffffffffff161415611c865760009250611d28565b8190508073ffffffffffffffffffffffffffffffffffffffff16638866eaec6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611ced57600080fd5b505af1158015611d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d2591908101906148b8565b92505b5050919050565b600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dc55780601f10611d9a57610100808354040283529160200191611dc5565b820191906000526020600020905b815481529060010190602001808311611da857829003601f168201915b505050505081565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e90614fc1565b60405180910390fd5b600083511415611e9a5760009050611eb3565b611eb08383601d6134029092919063ffffffff16565b90505b92915050565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f4f5780601f10611f2457610100808354040283529160200191611f4f565b820191906000526020600020905b815481529060010190602001808311611f3257829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60138054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120175780601f10611fec57610100808354040283529160200191612017565b820191906000526020600020905b815481529060010190602001808311611ffa57829003601f168201915b505050505081565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120b55780601f1061208a576101008083540402835291602001916120b5565b820191906000526020600020905b81548152906001019060200180831161209857829003601f168201915b505050505081565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161213a9190614c7b565b602060405180830381600087803b15801561215457600080fd5b505af1158015612168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061218c9190810190614672565b915060008273ffffffffffffffffffffffffffffffffffffffff1614156121b9576000809350935061225e565b819050818173ffffffffffffffffffffffffffffffffffffffff16638866eaec6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561222157600080fd5b505af1158015612235573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061225991908101906148b8565b935093505b5050915091565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60068054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561234b5780601f106123205761010080835404028352916020019161234b565b820191906000526020600020905b81548152906001019060200180831161232e57829003601f168201915b505050505081565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123e95780601f106123be576101008083540402835291602001916123e9565b820191906000526020600020905b8154815290600101906020018083116123cc57829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614fc1565b60405180910390fd5b60008251141561249857600090506124af565b6124ac82601d61375f90919063ffffffff16565b90505b919050565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561254a5780601f1061251f5761010080835404028352916020019161254a565b820191906000526020600020905b81548152906001019060200180831161252d57829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561260e5780601f106125e35761010080835404028352916020019161260e565b820191906000526020600020905b8154815290600101906020018083116125f157829003601f168201915b505050505081565b600080600080612625856139b1565b915060008273ffffffffffffffffffffffffffffffffffffffff1614156126525781600093509350612812565b84600060048110151561266157fe5b6020020151905060008651111561275f573073ffffffffffffffffffffffffffffffffffffffff1663d24bfcf38783856040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016126cb93929190614f63565b602060405180830381600087803b1580156126e557600080fd5b505af11580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061271d91908101906148b8565b151561275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614fa1565b60405180910390fd5b5b813073ffffffffffffffffffffffffffffffffffffffff166337258c0d848c8c8c6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127bb9493929190614cf0565b602060405180830381600087803b1580156127d557600080fd5b505af11580156127e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061280d91908101906148b8565b935093505b50509550959350505050565b6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060608060008473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141561288d5760009350612943565b61289e61289986611889565b613a7e565b92506128b38388613ac290919063ffffffff16565b9150816040518082805190602001908083835b6020831015156128eb57805182526020820191506020810190506020830392506128c6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856000191681600019161415156129345760009350612943565b61293d85613ad6565b50600193505b5050509392505050565b60006060600080600080600080600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614806129c15750600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16145b806129cd575060008951145b156129db576000975061300c565b6129ef89601d6132ef90919063ffffffff16565b9650600087511415612aba57612aa960058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a945780601f10612a6957610100808354040283529160200191612a94565b820191906000526020600020905b815481529060010190602001808311612a7757829003601f168201915b5050505050601d6132ef90919063ffffffff16565b9650600087511415612ab9578896505b5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e0168c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612b319190614c7b565b602060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b839190810190614672565b955060008673ffffffffffffffffffffffffffffffffffffffff161415612bad576000975061300c565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e0168b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c249190614c7b565b602060405180830381600087803b158015612c3e57600080fd5b505af1158015612c52573d6000803e3d6000fd5b505050506040513d601f19601f820116820180","60405250612c769190810190614672565b945060008573ffffffffffffffffffffffffffffffffffffffff161415612ca0576000975061300c565b8493508373ffffffffffffffffffffffffffffffffffffffff1663d195143c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612d0757600080fd5b505af1158015612d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d3f9190810190614672565b9250601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff1663357a9e0b876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612dbb9190614c7b565b602060405180830381600087803b158015612dd557600080fd5b505af1158015612de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e0d91908101906148b8565b15612e3c57601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612e97565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161415612e9657601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5b7f8a16141a1c2a81d8195460d0c64567dab6fff6860f6bf2a02c82941b09e655498b60008c868d604051612ecf959493929190614e42565b60405180910390a1866040518082805190602001908083835b602083101515612f0d5780518252602082019150602081019050602083039250612ee8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3a269398483856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612fb793929190614e0b565b602060405180830381600087803b158015612fd157600080fd5b505af1158015612fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061300991908101906148b8565b97505b505050505050509392505050565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130b05780601f10613085576101008083540402835291602001916130b0565b820191906000526020600020905b81548152906001019060200180831161309357829003601f168201915b505050505081565b6000806000806130c7856139b1565b915060008273ffffffffffffffffffffffffffffffffffffffff1614156130f457816000935093506132b2565b84600060048110151561310357fe5b60200201519050600086511115613201573073ffffffffffffffffffffffffffffffffffffffff1663d24bfcf38783856040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161316d93929190614f63565b602060405180830381600087803b15801561318757600080fd5b505af115801561319b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131bf91908101906148b8565b1515613200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f790614fa1565b60405180910390fd5b5b813073ffffffffffffffffffffffffffffffffffffffff1663e696f175848b8b6040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161325b93929190614d3c565b602060405180830381600087803b15801561327557600080fd5b505af1158015613289573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132ad91908101906148b8565b935093505b505094509492505050565b6060806000806132d78560006132d288613db4565b613dc2565b80945081955082965083975050505050509193909250565b606082600001826040518082805190602001908083835b60208310151561332b5780518252602082019150602081019050602083039250613306565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133f55780601f106133ca576101008083540402835291602001916133f5565b820191906000526020600020905b8154815290600101906020018083116133d857829003601f168201915b5050505050905092915050565b60008084600001846040518082805190602001908083835b60208310151561343f578051825260208201915060208101905060208303925061341a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000154905060008111156135f2577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151561351557805182526020820191506020810190506020830392506134f0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405161355c959493929190614d7a565b60405180910390a18285600001856040518082805190602001908083835b60208310151561359f578051825260208201915060208101905060208303925061357a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906135e89291906143b7565b5060019150613757565b8285600001856040518082805190602001908083835b60208310151561362d5780518252602082019150602081019050602083039250613608565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906136769291906143b7565b5084600101805480919060010161368d9190614437565b90506001810185600001856040518082805190602001908083835b6020831015156136cd57805182526020820191506020810190506020830392506136a8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000018190555083856001018281548110151561371957fe5b9060005260206000209060020201600001908051906020019061373d9291906143b7565b508460020160008154809291906001019190505550600091505b509392505050565b60008083600001836040518082805190602001908083835b60208310151561379c5780518252602082019150602081019050602083039250613777565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000154905060008114156137e757600091506139aa565b7f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b60208310151561387b5780518252602082019150602081019050602083039250613856565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516138c2959493929190614d7a565b60405180910390a183600001836040518082805190602001908083835b60208310151561390457805182526020820191506020810190506020830392506138df565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000808201600090556001820160006139509190614469565b50506001846001016001830381548110151561396857fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b6000806000806000808660006004811015156139c957fe5b602002015194508660016004811015156139df57fe5b602002015193506139f38460001916613f02565b9250866002600481101515613a0457fe5b60200201519150866003600481101515613a1a57fe5b6020020151905060018584848460405160008152602001604052604051613a449493929190614efc565b60206040516020810390808403906000865af1158015613a68573d6000803e3d6000fd5b5050506020604051035195505050505050919050565b606060206040519080825280601f01601f191660200182016040528015613ab45781602001602082028038833980820191505090505b509050816020820152919050565b6060613ace8383613f98565b905092915050565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613b539190614c7b565b602060405180830381600087803b158015613b6d57600080fd5b505af1158015613b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ba59190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff161415613bcf5760009350613dac565b8291508173ffffffffffffffffffffffffffffffffffffffff16633bc5de306040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613c3657600080fd5b505af1158015613c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c6e91","90810190614672565b90508073ffffffffffffffffffffffffffffffffffffffff16630feca68a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613cd457600080fd5b505af1158015613ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d0c91908101906149f5565b508073ffffffffffffffffffffffffffffffffffffffff1663d087d2886040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613d7157600080fd5b505af1158015613d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613da991908101906149f5565b93505b505050919050565b600081600201549050919050565b60608060008060008060608088604051908082528060200260200182016040528015613e0257816020015b6060815260200190600190039081613ded5790505b50975088604051908082528060200260200182016040528015613e3957816020015b6060815260200190600190039081613e245790505b509650600093506000925060009550600094508993505b613e5a8b85614169565b15613ef557613e698b8561417d565b91509150818884815181101515613e7c57fe5b90602001906020020181905250808784815181101515613e9857fe5b90602001906020020181905250828060010193505085806001019650508886101515613ee457613ec88b8561434f565b9450613ed48b86614169565b1515613edf57600094505b613ef5565b613eee8b8561434f565b9350613e50565b5050505093509350935093565b6000806000809150600090505b6020811015613f8e576001810160200360080260020a8482602081101515613f3357fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1602820191508080600101915050613f0f565b8192505050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613fe05781602001602082028038833980820191505090505b50935083925060009150600090505b85518110156140a257858181518110151561400657fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561406557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613fef565b600090505b845181101561415a5784818151811015156140be57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561411d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506140a7565b83965050505050505092915050565b600082600101805490508210905092915050565b606080836001018381548110151561419157fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156142365780601f1061420b57610100808354040283529160200191614236565b820191906000526020600020905b81548152906001019060200180831161421957829003601f168201915b5050505050915083600001826040518082805190602001908083835b6020831015156142775780518252602082019150602081019050602083039250614252565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b505050505090509250929050565b600081806001019250505b82600101805490508210801561439c5750826001018281548110151561437c57fe5b906000526020600020906002020160010160009054906101000a900460ff165b156143ae57818060010192505061435a565b81905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143f857805160ff1916838001178555614426565b82800160010185558215614426579182015b8281111561442557825182559160200191906001019061440a565b5b50905061443391906144b1565b5090565b8154818355818111156144645760020281600202836000526020600020918201910161446391906144d6565b5b505050565b50805460018160011615610100020316600290046000825580601f1061448f57506144ae565b601f0160209004906000526020600020908101906144ad91906144b1565b5b50565b6144d391905b808211156144cf5760008160009055506001016144b7565b5090565b90565b61451691905b8082111561451257600080820160006144f59190614469565b6001820160006101000a81549060ff0219169055506002016144dc565b5090565b90565b6000614525823561513d565b905092915050565b6000614539825161513d565b905092915050565b600082601f830112151561455457600080fd5b600461456761456282615029565b614ffc565b9150818385602084028201111561457d57600080fd5b60005b838110156145ad578161459388826145cb565b845260208401935060208301925050600181019050614580565b5050505092915050565b60006145c3825161515d565b905092915050565b60006145d78235615169565b905092915050565b600082601f83011215156145f257600080fd5b81356146056146008261504b565b614ffc565b9150808252602083016020830185838301111561462157600080fd5b61462c83828461518f565b50505092915050565b60006146418251615173565b905092915050565b60006020828403121561465b57600080fd5b600061466984828501614519565b91505092915050565b60006020828403121561468457600080fd5b60006146928482850161452d565b91505092915050565b600080600080608085870312156146b157600080fd5b60006146bf87828801614519565b94505060206146d087828801614519565b93505060406146e187828801614519565b925050606085013567ffffffffffffffff8111156146fe57600080fd5b61470a878288016145df565b91505092959194509250565b60008060006060848603121561472b57600080fd5b600061473986828701614519565b935050602061474a86828701614519565b925050604084013567ffffffffffffffff81111561476757600080fd5b614773868287016145df565b9150509250925092565b6000806000806000610100868803121561479657600080fd5b60006147a488828901614519565b95505060206147b588828901614519565b945050604086013567ffffffffffffffff8111156147d257600080fd5b6147de888289016145df565b935050606086013567ffffffffffffffff8111156147fb57600080fd5b614807888289016145df565b925050608061481888828901614541565b9150509295509295909350565b60008060008060e0858703121561483b57600080fd5b600061484987828801614519565b945050602085013567ffffffffffffffff81111561486657600080fd5b614872878288016145df565b935050604085013567ffffffffffffffff81111561488f57600080fd5b61489b878288016145df565b92505060606148ac87828801614541565b91505092959194509250565b6000602082840312156148ca57600080fd5b60006148d8848285016145b7565b91505092915050565b6000602082840312156148f357600080fd5b600082013567ffffffffffffffff81111561490d57600080fd5b614919848285016145df565b91505092915050565b60008060006060848603121561493757600080fd5b600084013567ffffffffffffffff81111561495157600080fd5b61495d868287016145df565b935050602061496e868287016145cb565b925050604061497f86828701614519565b9150509250925092565b6000806040838503121561499c57600080fd5b600083013567ffffffffffffffff8111156149b657600080fd5b6149c2858286016145df565b925050602083013567ffffffffffffffff8111156149df57600080fd5b6149eb858286016145df565b9150509250929050565b600060208284031215614a0757600080fd5b6000614a1584828501614635565b91505092915050565b614a27816150c4565b82525050565b6000614a3882615096565b80845260208401935083602082028501614a5185615077565b60005b84811015614a8a578383038852614a6c838351614afe565b9250614a77826150b7565b9150602088019750600181019050614a54565b508196508694505050505092915050565b614aa4816150e4565b82525050565b614ab3816150f0565b82525050565b614ac2816150fa565b82525050565b6000614ad3826150ac565b808452614ae781602086016020860161519e565b614af0816151d1565b602085010191505092915050565b6000614b09826150a1565b808452614b1d81602086016020860161519e565b614b26816151d1565b602085010191505092915050565b600081546001811660008114614b515760018114614b7157614bb2565b607f600283041680865260ff198316602087015260408601935050614bb2565b60028204808652602086019550614b8785615084565b60005b82811015614ba957815481890152600182019150602081019050614b8a565b80880195505050505b505092915050565b614bc38161517d565b82525050565b6000601882527f61726773206f72206e6f6e6365206e6f742076657269667900000000000000006020830152604082019050919050565b6000602582527f4175746843656e7465723a206f6e6c79206f776e657220697320617574686f7260208301527f697a65642e0000000000000000000000000000000000000000000000000000006040830152606082019050919050565b614c668161512656","5b82525050565b614c7581615130565b82525050565b6000602082019050614c906000830184614a1e565b92915050565b600060a082019050614cab6000830188614a1e565b614cb86020830187614a1e565b614cc56040830186614a1e565b614cd26060830185614a1e565b8181036080830152614ce48184614ac8565b90509695505050505050565b6000608082019050614d056000830187614a1e565b614d126020830186614a1e565b614d1f6040830185614a1e565b8181036060830152614d318184614ac8565b905095945050505050565b6000606082019050614d516000830186614a1e565b614d5e6020830185614a1e565b8181036040830152614d708184614ac8565b9050949350505050565b600060a082019050614d8f6000830188614a1e565b614d9c6020830187614a1e565b8181036040830152614dae8186614afe565b90508181036060830152614dc28185614ac8565b90508181036080830152614dd68184614b34565b90509695505050505050565b6000604082019050614df76000830185614a1e565b614e046020830184614a9b565b9392505050565b6000606082019050614e206000830186614a1e565b614e2d6020830185614ab9565b614e3a6040830184614a1e565b949350505050565b600060a082019050614e576000830188614a1e565b614e646020830187614bba565b614e716040830186614a1e565b614e7e6060830185614a1e565b8181036080830152614e908184614ac8565b90509695505050505050565b60006060820190508181036000830152614eb68186614a2d565b90508181036020830152614eca8185614a2d565b9050614ed96040830184614c5d565b949350505050565b6000602082019050614ef66000830184614a9b565b92915050565b6000608082019050614f116000830187614aaa565b614f1e6020830186614c6c565b614f2b6040830185614aaa565b614f386060830184614aaa565b95945050505050565b60006020820190508181036000830152614f5b8184614afe565b905092915050565b60006060820190508181036000830152614f7d8186614ac8565b9050614f8c6020830185614aaa565b614f996040830184614a1e565b949350505050565b60006020820190508181036000830152614fba81614bc9565b9050919050565b60006020820190508181036000830152614fda81614c00565b9050919050565b6000602082019050614ff66000830184614c5d565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561501f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561504057600080fd5b602082029050919050565b600067ffffffffffffffff82111561506257600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600060ff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000615188826150c4565b9050919050565b82818337600083830152505050565b60005b838110156151bc5780820151818401526020810190506151a1565b838111156151cb576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a7230582013305c149e7a6cef1c2931494eb20757ff3988b6d7a76c533cedb253de009dd56c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c69630000000000000000000000000000000000000000000000000000815250600090805190602001906200005192919062000efc565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f92919062000efc565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed92919062000efc565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b92919062000efc565b506040805190810160405280600281526020017f5f77000000000000000000000000000000000000000000000000000000000000815250600490805190602001906200018992919062000efc565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d792919062000efc565b506040805190810160405280600281526020017f6964000000000000000000000000000000000000000000000000000000000000815250600690805190602001906200022592919062000efc565b506040805190810160405280600481526020017f6164647200000000000000000000000000000000000000000000000000000000815250600790805190602001906200027392919062000efc565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c192919062000efc565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f92919062000efc565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d92919062000efc565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab92919062000efc565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f992919062000efc565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d90805190602001906200044792919062000efc565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e90805190602001906200049592919062000efc565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e392919062000efc565b506040805190810160405280600781526020017f62616c616e636500000000000000000000000000000000000000000000000000815250601090805190602001906200053192919062000efc565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f92919062000efc565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd92919062000efc565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b92919062000efc565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250601490805190602001906200066992919062000efc565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b792919062000efc565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b50604051604080620065b68339810180604052620007f7919081019062001111565b33601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a1c600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620009585780601f106200092c5761010080835404028352916020019162000958565b820191906000526020600020905b8154815290600101906020018083116200093a57829003601f168201915b505050505060008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620009f75780601f10620009cb57610100808354040283529160200191620009f7565b820191906000526020600020905b815481529060010190602001808311620009d957829003601f168201915b5050505050601d62000b88640100000000026200380517909291906401000000009004565b5062000b7f600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562000abb5780601f1062000a8f5761010080835404028352916020019162000abb565b820191906000526020600020905b81548152906001019060200180831162000a9d57829003601f168201915b505050505060028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562000b5a5780601f1062000b2e5761010080835404028352916020019162000b5a565b820191906000526020600020905b81548152906001019060200180831162000b3c57829003601f168201915b5050505050601d62000b88640100000000026200380517909291906401000000009004565b5050506200138a565b60008084600001846040518082805190602001908083835b60208310151562000bc7578051825260208201915060208101905060208303925062000ba0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000d84577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000ca0578051825260208201915060208101905060208303925062000c79565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000ce995949392919062001269565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000d2e578051825260208201915060208101905060208303925062000d07565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000d7992919062000f83565b506001915062000ef4565b8285600001856040518082805190602001908083835b60208310151562000dc1578051825260208201915060208101905060208303925062000d9a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000e0c92919062000f83565b5084600101805480919060010162000e2591906200100a565b90506001810185600001856040518082805190602001908083835b60208310151562000e67578051825260208201915060208101905060208303925062000e40565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000018190555083856001018281548110151562000eb457fe5b9060005260206000209060020201600001908051906020019062000eda92919062000f83565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000f3f57805160ff191683800117855562000f70565b8280016001018555821562000f70579182015b8281111562000f6f57825182559160200191906001019062000f52565b5b50905062000f7f91906200103f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000fc657805160ff191683800117855562000ff7565b8280016001018555821562000ff7579182015b8281111562000ff657825182559160200191906001019062000fd9565b5b5090506200100691","906200103f565b5090565b8154818355818111156200103a5760020281600202836000526020600020918201910162001039919062001067565b5b505050565b6200106491905b808211156200106057600081600090555060010162001046565b5090565b90565b620010ac91905b80821115620010a857600080820160006200108a9190620010af565b6001820160006101000a81549060ff0219169055506002016200106e565b5090565b90565b50805460018160011615610100020316600290046000825580601f10620010d75750620010f8565b601f016020900490600052602060002090810190620010f791906200103f565b5b50565b600062001109825162001323565b905092915050565b600080604083850312156200112557600080fd5b60006200113585828601620010fb565b92505060206200114885828601620010fb565b9150509250929050565b6200115d8162001303565b82525050565b60006200117082620012f8565b8084526200118681602086016020860162001343565b620011918162001379565b602085010191505092915050565b6000620011ac82620012ed565b808452620011c281602086016020860162001343565b620011cd8162001379565b602085010191505092915050565b600081546001811660008114620011fb57600181146200121c5762001261565b607f600283041680865260ff19831660208701526040860193505062001261565b600282048086526020860195506200123485620012db565b60005b82811015620012585781548189015260018201915060208101905062001237565b80880195505050505b505092915050565b600060a08201905062001280600083018862001152565b6200128f602083018762001152565b8181036040830152620012a381866200119f565b90508181036060830152620012b9818562001163565b90508181036080830152620012cf8184620011db565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200136357808201518184015260208101905062001346565b8381111562001373576000848401525b50505050565b6000601f19601f8301169050919050565b61521c806200139a6000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630bc95c79146101f35780630c9481b91461021e5780630e628322146102495780630eecf41e14610287578063112da303146102c45780631500025a146102ef5780631a1f1cd21461031a5780631dc5d722146103455780631f8827e6146103725780634154f885146103af57806342033801146103ed578063520bdf0a146104185780635edfd6fa1461045557806367e09af51461048057806374b00d53146104ab578063769fe342146104d65780637e3a1ef4146105015780637f00af971461052c5780638a4451f5146105575780638d478f29146105825780639562bc16146105bf57806398068364146105fc578063b09a50fe14610627578063b32941d814610652578063bcc6cdb61461067d578063bced9535146106a8578063bfabb86d146106d3578063c03fd5e7146106fe578063c6125d0c14610729578063c624d53414610754578063cfe3b1251461077f578063d1281a78146107bd578063d617f06d146107e8578063d7e7948f14610813578063e369915e1461083e578063e92139da1461087b578063ece272e3146108a6578063ee19b0cf146108d1578063f6cb4bc5146108fc578063fbfdd9f514610927575b600080fd5b3480156101ff57600080fd5b50610208610964565b6040516102159190614c7b565b60405180910390f35b34801561022a57600080fd5b5061023361098a565b6040516102409190614f41565b60405180910390f35b34801561025557600080fd5b50610270600480360361026b9190810190614649565b610a28565b60405161027e929190614de2565b60405180910390f35b34801561029357600080fd5b506102ae60048036036102a99190810190614649565b610bd0565b6040516102bb9190614fe1565b60405180910390f35b3480156102d057600080fd5b506102d9610e11565b6040516102e69190614f41565b60405180910390f35b3480156102fb57600080fd5b50610304610eaf565b6040516103119190614c7b565b60405180910390f35b34801561032657600080fd5b5061032f610ed9565b60405161033c9190614f41565b60405180910390f35b34801561035157600080fd5b5061035a610f77565b60405161036993929190614e9c565b60405180910390f35b34801561037e57600080fd5b5061039960048036036103949190810190614922565b610f91565b6040516103a69190614ee1565b60405180910390f35b3480156103bb57600080fd5b506103d660048036036103d19190810190614825565b611096565b6040516103e4929190614de2565b60405180910390f35b3480156103f957600080fd5b5061040261129b565b60405161040f9190614f41565b60405180910390f35b34801561042457600080fd5b5061043f600480360361043a9190810190614649565b611339565b60405161044c9190614ee1565b60405180910390f35b34801561046157600080fd5b5061046a6114da565b6040516104779190614f41565b60405180910390f35b34801561048c57600080fd5b50610495611578565b6040516104a29190614f41565b60405180910390f35b3480156104b757600080fd5b506104c0611616565b6040516104cd9190614c7b565b60405180910390f35b3480156104e257600080fd5b506104eb61163c565b6040516104f89190614f41565b60405180910390f35b34801561050d57600080fd5b506105166116da565b6040516105239190614f41565b60405180910390f35b34801561053857600080fd5b50610541611778565b60405161054e9190614f41565b60405180910390f35b34801561056357600080fd5b5061056c611816565b6040516105799190614c7b565b60405180910390f35b34801561058e57600080fd5b506105a960048036036105a4919081019061469b565b61183c565b6040516105b69190614ee1565b60405180910390f35b3480156105cb57600080fd5b506105e660048036036105e19190810190614716565b611fdf565b6040516105f39190614ee1565b60405180910390f35b34801561060857600080fd5b506106116126ac565b60405161061e9190614f41565b60405180910390f35b34801561063357600080fd5b5061063c61274a565b6040516106499190614f41565b60405180910390f35b34801561065e57600080fd5b506106676127e8565b6040516106749190614f41565b60405180910390f35b34801561068957600080fd5b50610692612886565b60405161069f9190614f41565b60405180910390f35b3480156106b457600080fd5b506106bd612924565b6040516106ca9190614f41565b60405180910390f35b3480156106df57600080fd5b506106e86129c2565b6040516106f59190614f41565b60405180910390f35b34801561070a57600080fd5b50610713612a60565b6040516107209190614c7b565b60405180910390f35b34801561073557600080fd5b5061073e612a86565b60405161074b9190614f41565b60405180910390f35b34801561076057600080fd5b50610769612b24565b6040516107769190614c7b565b60405180910390f35b34801561078b57600080fd5b506107a660048036036107a1919081019061477d565b612b4e565b6040516107b4929190614de2565b60405180910390f35b3480156107c957600080fd5b506107d2612d56565b6040516107df9190614f41565b60405180910390f35b3480156107f457600080fd5b506107fd612df4565b60405161080a9190614f41565b60405180910390f35b34801561081f57600080fd5b50610828612e92565b6040516108359190614f41565b60405180910390f35b34801561084a57600080fd5b5061086560048036036108609190810190614989565b612f30565b6040516108729190614ee1565b60405180910390f35b34801561088757600080fd5b50610890612ff6565b60405161089d9190614c7b565b60405180910390f35b3480156108b257600080fd5b506108bb613020565b6040516108c89190614f41565b60405180910390f35b3480156108dd57600080fd5b506108e66130be565b6040516108f39190614f41565b60405180910390f35b34801561090857600080fd5b5061091161315c565b60405161091e9190614f41565b60405180910390f35b34801561093357600080fd5b5061094e600480360361094991908101906148e1565b6131fa565b60405161095b9190614ee1565b60405180910390f35b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a205780601f106109f557610100808354040283529160200191610a20565b820191906000526020600020905b815481529060010190602001808311610a0357829003601f168201915b505050505081565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610aa59190614c7b565b602060405180830381600087803b158015610abf57600080fd5b505af1158015610ad3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610af79190810190614672565b915060008273ffffffffffffffffffffffffffffffffffffffff161415610b245760008093509350610bc9565b819050818173ffffffffffffffffffffffffffffffffffffffff166335968e686040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610b8c57600080fd5b505af1158015610ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc491908101906148b8565b935093505b5050915091565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610c4d9190614c7b565b602060405180830381600087803b158015610c6757600080","fd5b505af1158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c9f9190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff161415610cc95760009350610e09565b8291508173ffffffffffffffffffffffffffffffffffffffff1663e211e0c16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d3057600080fd5b505af1158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190614672565b90508073ffffffffffffffffffffffffffffffffffffffff1663567f28366040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610dce57600080fd5b505af1158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e0691908101906149f5565b93505b505050919050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b505050505081565b6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6f5780601f10610f4457610100808354040283529160200191610f6f565b820191906000526020600020905b815481529060010190602001808311610f5257829003601f168201915b505050505081565b6060806000610f86601d6132bd565b925092509250909192565b600060608060008473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415610fd6576000935061108c565b610fe7610fe286610bd0565b6132ef565b9250610ffc838861333390919063ffffffff16565b9150816040518082805190602001908083835b602083101515611034578051825260208201915060208101905060208303925061100f565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090508560001916816000191614151561107d576000935061108c565b61108685613347565b50600193505b5050509392505050565b6000806000806110a585613625565b915060008273ffffffffffffffffffffffffffffffffffffffff1614156110d25781600093509350611290565b8460006004811015156110e157fe5b602002015190506000865111156111df573073ffffffffffffffffffffffffffffffffffffffff16631f8827e68783856040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161114b93929190614f63565b602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061119d91908101906148b8565b15156111de576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016111d590614fa1565b60405180910390fd5b5b813073ffffffffffffffffffffffffffffffffffffffff16639562bc16848b8b6040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161123993929190614d3c565b602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061128b91908101906148b8565b935093505b505094509492505050565b60138054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113315780601f1061130657610100808354040283529160200191611331565b820191906000526020600020905b81548152906001019060200180831161131457829003601f168201915b505050505081565b6000806000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74856040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113b59190614c7b565b602060405180830381600087803b1580156113cf57600080fd5b505af11580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114079190810190614672565b915060008273ffffffffffffffffffffffffffffffffffffffff16141561143157600092506114d3565b8190508073ffffffffffffffffffffffffffffffffffffffff166335968e686040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561149857600080fd5b505af11580156114ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114d091908101906148b8565b92505b5050919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115705780601f1061154557610100808354040283529160200191611570565b820191906000526020600020905b81548152906001019060200180831161155357829003601f168201915b505050505081565b600a8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561160e5780601f106115e35761010080835404028352916020019161160e565b820191906000526020600020905b8154815290600101906020018083116115f157829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117705780601f1061174557610100808354040283529160200191611770565b820191906000526020600020905b81548152906001019060200180831161175357829003601f168201915b505050505081565b60088054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561180e5780601f106117e35761010080835404028352916020019161180e565b820191906000526020600020905b8154815290600101906020018083116117f157829003601f168201915b505050505081565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606060008060008060008073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614806118ae5750600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16145b806118ba575060008851145b156118c85760009650611fd1565b6118dc88601d6136f290919063ffffffff16565b95506000865114156119a75761199660058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119815780601f1061195657610100808354040283529160200191611981565b820191906000526020600020905b81548152906001019060200180831161196457829003601f168201915b5050505050601d6136f290919063ffffffff16565b95506000865114156119a6578795505b5b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161415611a0557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450611e5d565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f748c6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611a7c9190614c7b565b602060405180830381600087803b158015611a9657600080fd5b505af1158015611aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ace9190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff16141515611e58578291508173ffffffffffffffffffffffffffffffffffffffff1663e211e0c16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611b5757600080fd5b505af1158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b8f9190810190614672565b73ffffffffffffffffffffffffffffffffffffffff16635f12ec2e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611bf257600080fd5b505af1158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c2a9190810190614672565b9350601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508373ffffffffffffffffffffffffffffffffffff","ffff1663401e5eff846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611ca69190614c7b565b602060405180830381600087803b158015611cc057600080fd5b505af1158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611cf891908101906148b8565b15611d2757601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450611e53565b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611e2757508873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663e211e0c16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611dd757600080fd5b505af1158015611deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e0f9190810190614672565b73ffffffffffffffffffffffffffffffffffffffff16145b15611e5257601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694505b5b611e5c565b8a94505b5b7f2c0ca52b560c23badeadeeb266eeac4ca275ea82b925a2861763dc7eb26894908b858b8d8c604051611e94959493929190614c96565b60405180910390a1856040518082805190602001908083835b602083101515611ed25780518252602082019150602081019050602083039250611ead565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166328e9610c8b83886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611f7c93929190614e0b565b602060405180830381600087803b158015611f9657600080fd5b505af1158015611faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fce91908101906148b8565b96505b505050505050949350505050565b60006060600080600080600080600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614806120535750600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16145b8061205f575060008951145b1561206d576000975061269e565b61208189601d6136f290919063ffffffff16565b965060008751141561214c5761213b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121265780601f106120fb57610100808354040283529160200191612126565b820191906000526020600020905b81548152906001019060200180831161210957829003601f168201915b5050505050601d6136f290919063ffffffff16565b965060008751141561214b578896505b5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f748c6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016121c39190614c7b565b602060405180830381600087803b1580156121dd57600080fd5b505af11580156121f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122159190810190614672565b955060008673ffffffffffffffffffffffffffffffffffffffff16141561223f576000975061269e565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f748b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016122b69190614c7b565b602060405180830381600087803b1580156122d057600080fd5b505af11580156122e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123089190810190614672565b945060008573ffffffffffffffffffffffffffffffffffffffff161415612332576000975061269e565b8493508373ffffffffffffffffffffffffffffffffffffffff16634292918f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561239957600080fd5b505af11580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123d19190810190614672565b9250601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff1663401e5eff876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161244d9190614c7b565b602060405180830381600087803b15801561246757600080fd5b505af115801561247b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249f91908101906148b8565b156124ce57601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612529565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16141561252857601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5b7f2c0ca52b560c23badeadeeb266eeac4ca275ea82b925a2861763dc7eb26894908b60008c868d604051612561959493929190614e42565b60405180910390a1866040518082805190602001908083835b60208310151561259f578051825260208201915060208101905060208303925061257a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166328e9610c8483856040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161264993929190614e0b565b602060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061269b91908101906148b8565b97505b505050505050509392505050565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127425780601f1061271757610100808354040283529160200191612742565b820191906000526020600020905b81548152906001019060200180831161272557829003601f168201915b505050505081565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127e05780601f106127b5576101008083540402835291602001916127e0565b820191906000526020600020905b8154815290600101906020018083116127c357829003601f168201915b505050505081565b60148054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561291c5780601f106128f15761010080835404028352916020019161291c565b820191906000526020600020905b8154815290600101906020018083116128ff57829003601f168201915b505050505081565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129ba5780601f1061298f576101008083540402835291602001916129ba565b820191906000526020600020905b81548152906001019060200180831161299d57829003601f168201915b505050505081565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a585780601f10612a2d57610100808354040283529160200191612a58565b820191906000526020600020905b815481529060010190602001808311612a3b57829003601f168201915b505050505081565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b1c5780601f10612af157610100808354040283529160200191612b1c565b820191906000526020600020905b815481529060010190602001808311612aff57829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600080612b5d85613625565b915060008273ffffffffffffffffffffffffffffffffffffffff161415612b8a5781600093509350612d4a565b846000600481101515612b9957fe5b60200201519050600086511115612c97573073ffffffffffffffffffffffffffffffffffffffff16631f8827e68783856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c0393929190614f63565b602060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c5591908101906148b8565b1515612c96576040517fc703cb120000","00000000000000000000000000000000000000000000000000008152600401612c8d90614fa1565b60405180910390fd5b5b813073ffffffffffffffffffffffffffffffffffffffff16638d478f29848c8c8c6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612cf39493929190614cf0565b602060405180830381600087803b158015612d0d57600080fd5b505af1158015612d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d4591908101906148b8565b935093505b50509550959350505050565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612dec5780601f10612dc157610100808354040283529160200191612dec565b820191906000526020600020905b815481529060010190602001808311612dcf57829003601f168201915b505050505081565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e8a5780601f10612e5f57610100808354040283529160200191612e8a565b820191906000526020600020905b815481529060010190602001808311612e6d57829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f285780601f10612efd57610100808354040283529160200191612f28565b820191906000526020600020905b815481529060010190602001808311612f0b57829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612fc4576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612fbb90614fc1565b60405180910390fd5b600083511415612fd75760009050612ff0565b612fed8383601d6138059092919063ffffffff16565b90505b92915050565b6000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130b65780601f1061308b576101008083540402835291602001916130b6565b820191906000526020600020905b81548152906001019060200180831161309957829003601f168201915b505050505081565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131545780601f1061312957610100808354040283529160200191613154565b820191906000526020600020905b81548152906001019060200180831161313757829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131f25780601f106131c7576101008083540402835291602001916131f2565b820191906000526020600020905b8154815290600101906020018083116131d557829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561328e576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161328590614fc1565b60405180910390fd5b6000825114156132a157600090506132b8565b6132b582601d613b6290919063ffffffff16565b90505b919050565b6060806000806132d78560006132d288613db4565b613dc2565b80945081955082965083975050505050509193909250565b606060206040519080825280601f01601f1916602001820160405280156133255781602001602082028038833980820191505090505b509050816020820152919050565b606061333f8383613f02565b905092915050565b600080600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016133c49190614c7b565b602060405180830381600087803b1580156133de57600080fd5b505af11580156133f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134169190810190614672565b925060008373ffffffffffffffffffffffffffffffffffffffff161415613440576000935061361d565b8291508173ffffffffffffffffffffffffffffffffffffffff1663e211e0c16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156134a757600080fd5b505af11580156134bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134df9190810190614672565b90508073ffffffffffffffffffffffffffffffffffffffff16634425c4266040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561354557600080fd5b505af1158015613559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061357d91908101906149f5565b508073ffffffffffffffffffffffffffffffffffffffff1663567f28366040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156135e257600080fd5b505af11580156135f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061361a91908101906149f5565b93505b505050919050565b60008060008060008086600060048110151561363d57fe5b6020020151945086600160048110151561365357fe5b6020020151935061366784600019166140d3565b925086600260048110151561367857fe5b6020020151915086600360048110151561368e57fe5b60200201519050600185848484604051600081526020016040526040516136b89493929190614efc565b60206040516020810390808403906000865af11580156136dc573d6000803e3d6000fd5b5050506020604051035195505050505050919050565b606082600001826040518082805190602001908083835b60208310151561372e5780518252602082019150602081019050602083039250613709565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137f85780601f106137cd576101008083540402835291602001916137f8565b820191906000526020600020905b8154815290600101906020018083116137db57829003601f168201915b5050505050905092915050565b60008084600001846040518082805190602001908083835b602083101515613842578051825260208201915060208101905060208303925061381d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000154905060008111156139f5577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151561391857805182526020820191506020810190506020830392506138f3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405161395f959493929190614d7a565b60405180910390a18285600001856040518082805190602001908083835b6020831015156139a2578051825260208201915060208101905060208303925061397d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906139eb9291906143b7565b5060019150613b5a565b8285600001856040518082805190602001908083835b602083101515613a305780518252602082019150602081019050602083039250613a0b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001019080519060200190613a799291906143b7565b50846001018054809190600101613a909190614437565b90506001810185600001856040518082805190602001908083835b602083101515613ad05780518252602082019150602081019050602083039250613aab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000181905550838560010182815481101515613b1c57fe5b90600052602060002090600202016000019080519060200190613b409291906143b7565b508460020160008154809291906001019190505550600091505b509392505050565b60008083600001836040518082805190602001908083835b602083101515613b9f5780518252602082019150602081019050602083039250613b7a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811415613bea5760009150613dad565b7fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b602083101515613c7e578051","8252602082019150602081019050602083039250613c59565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101604051613cc5959493929190614d7a565b60405180910390a183600001836040518082805190602001908083835b602083101515613d075780518252602082019150602081019050602083039250613ce2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160009055600182016000613d539190614469565b505060018460010160018303815481101515613d6b57fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b600081600201549050919050565b60608060008060008060608088604051908082528060200260200182016040528015613e0257816020015b6060815260200190600190039081613ded5790505b50975088604051908082528060200260200182016040528015613e3957816020015b6060815260200190600190039081613e245790505b509650600093506000925060009550600094508993505b613e5a8b85614169565b15613ef557613e698b8561417d565b91509150818884815181101515613e7c57fe5b90602001906020020181905250808784815181101515613e9857fe5b90602001906020020181905250828060010193505085806001019650508886101515613ee457613ec88b8561434f565b9450613ed48b86614169565b1515613edf57600094505b613ef5565b613eee8b8561434f565b9350613e50565b5050505093509350935093565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613f4a5781602001602082028038833980820191505090505b50935083925060009150600090505b855181101561400c578581815181101515613f7057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515613fcf57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613f59565b600090505b84518110156140c457848181518110151561402857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561408757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614011565b83965050505050505092915050565b6000806000809150600090505b602081101561415f576001810160200360080260020a848260208110151561410457fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff16028201915080806001019150506140e0565b8192505050919050565b600082600101805490508210905092915050565b606080836001018381548110151561419157fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156142365780601f1061420b57610100808354040283529160200191614236565b820191906000526020600020905b81548152906001019060200180831161421957829003601f168201915b5050505050915083600001826040518082805190602001908083835b6020831015156142775780518252602082019150602081019050602083039250614252565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b505050505090509250929050565b600081806001019250505b82600101805490508210801561439c5750826001018281548110151561437c57fe5b906000526020600020906002020160010160009054906101000a900460ff165b156143ae57818060010192505061435a565b81905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143f857805160ff1916838001178555614426565b82800160010185558215614426579182015b8281111561442557825182559160200191906001019061440a565b5b50905061443391906144b1565b5090565b8154818355818111156144645760020281600202836000526020600020918201910161446391906144d6565b5b505050565b50805460018160011615610100020316600290046000825580601f1061448f57506144ae565b601f0160209004906000526020600020908101906144ad91906144b1565b5b50565b6144d391905b808211156144cf5760008160009055506001016144b7565b5090565b90565b61451691905b8082111561451257600080820160006144f59190614469565b6001820160006101000a81549060ff0219169055506002016144dc565b5090565b90565b6000614525823561513d565b905092915050565b6000614539825161513d565b905092915050565b600082601f830112151561455457600080fd5b600461456761456282615029565b614ffc565b9150818385602084028201111561457d57600080fd5b60005b838110156145ad578161459388826145cb565b845260208401935060208301925050600181019050614580565b5050505092915050565b60006145c3825161515d565b905092915050565b60006145d78235615169565b905092915050565b600082601f83011215156145f257600080fd5b81356146056146008261504b565b614ffc565b9150808252602083016020830185838301111561462157600080fd5b61462c83828461518f565b50505092915050565b60006146418251615173565b905092915050565b60006020828403121561465b57600080fd5b600061466984828501614519565b91505092915050565b60006020828403121561468457600080fd5b60006146928482850161452d565b91505092915050565b600080600080608085870312156146b157600080fd5b60006146bf87828801614519565b94505060206146d087828801614519565b93505060406146e187828801614519565b925050606085013567ffffffffffffffff8111156146fe57600080fd5b61470a878288016145df565b91505092959194509250565b60008060006060848603121561472b57600080fd5b600061473986828701614519565b935050602061474a86828701614519565b925050604084013567ffffffffffffffff81111561476757600080fd5b614773868287016145df565b9150509250925092565b6000806000806000610100868803121561479657600080fd5b60006147a488828901614519565b95505060206147b588828901614519565b945050604086013567ffffffffffffffff8111156147d257600080fd5b6147de888289016145df565b935050606086013567ffffffffffffffff8111156147fb57600080fd5b614807888289016145df565b925050608061481888828901614541565b9150509295509295909350565b60008060008060e0858703121561483b57600080fd5b600061484987828801614519565b945050602085013567ffffffffffffffff81111561486657600080fd5b614872878288016145df565b935050604085013567ffffffffffffffff81111561488f57600080fd5b61489b878288016145df565b92505060606148ac87828801614541565b91505092959194509250565b6000602082840312156148ca57600080fd5b60006148d8848285016145b7565b91505092915050565b6000602082840312156148f357600080fd5b600082013567ffffffffffffffff81111561490d57600080fd5b614919848285016145df565b91505092915050565b60008060006060848603121561493757600080fd5b600084013567ffffffffffffffff81111561495157600080fd5b61495d868287016145df565b935050602061496e868287016145cb565b925050604061497f86828701614519565b9150509250925092565b6000806040838503121561499c57600080fd5b600083013567ffffffffffffffff8111156149b657600080fd5b6149c2858286016145df565b925050602083013567ffffffffffffffff8111156149df57600080fd5b6149eb858286016145df565b9150509250929050565b600060208284031215614a0757600080fd5b6000614a1584828501614635565b91505092915050565b614a27816150c4565b82525050565b6000614a3882615096565b80845260208401935083602082028501614a5185615077565b60005b84811015614a8a578383038852614a6c838351614afe565b9250614a77826150b7565b9150602088019750600181019050614a54565b508196508694505050505092915050565b614aa4816150e4565b82525050565b614ab3816150f0565b82525050565b614ac2816150fa565b82525050565b6000614ad3826150ac565b808452614ae781602086016020860161519e565b614af0816151d1565b602085010191505092915050565b6000614b09826150a1565b808452614b1d81602086016020860161519e565b614b26816151d1565b602085010191505092915050565b600081546001811660008114614b515760018114614b7157614bb2565b607f600283041680865260ff198316602087015260408601935050614bb2565b60028204808652602086019550614b8785615084565b60005b82811015614ba957815481890152600182019150602081019050614b8a565b80880195505050505b505092915050565b614bc38161517d565b82525050565b6000601882527f61726773206f72206e6f6e6365206e6f742076657269667900000000000000006020830152604082019050919050565b6000602582527f4175746843656e7465723a206f6e6c79206f776e657220697320617574686f7260208301527f697a65642e0000000000000000000000000000000000000000000000000000006040830152606082019050919050565b614c668161512656","5b82525050565b614c7581615130565b82525050565b6000602082019050614c906000830184614a1e565b92915050565b600060a082019050614cab6000830188614a1e565b614cb86020830187614a1e565b614cc56040830186614a1e565b614cd26060830185614a1e565b8181036080830152614ce48184614ac8565b90509695505050505050565b6000608082019050614d056000830187614a1e565b614d126020830186614a1e565b614d1f6040830185614a1e565b8181036060830152614d318184614ac8565b905095945050505050565b6000606082019050614d516000830186614a1e565b614d5e6020830185614a1e565b8181036040830152614d708184614ac8565b9050949350505050565b600060a082019050614d8f6000830188614a1e565b614d9c6020830187614a1e565b8181036040830152614dae8186614afe565b90508181036060830152614dc28185614ac8565b90508181036080830152614dd68184614b34565b90509695505050505050565b6000604082019050614df76000830185614a1e565b614e046020830184614a9b565b9392505050565b6000606082019050614e206000830186614a1e565b614e2d6020830185614ab9565b614e3a6040830184614a1e565b949350505050565b600060a082019050614e576000830188614a1e565b614e646020830187614bba565b614e716040830186614a1e565b614e7e6060830185614a1e565b8181036080830152614e908184614ac8565b90509695505050505050565b60006060820190508181036000830152614eb68186614a2d565b90508181036020830152614eca8185614a2d565b9050614ed96040830184614c5d565b949350505050565b6000602082019050614ef66000830184614a9b565b92915050565b6000608082019050614f116000830187614aaa565b614f1e6020830186614c6c565b614f2b6040830185614aaa565b614f386060830184614aaa565b95945050505050565b60006020820190508181036000830152614f5b8184614afe565b905092915050565b60006060820190508181036000830152614f7d8186614ac8565b9050614f8c6020830185614aaa565b614f996040830184614a1e565b949350505050565b60006020820190508181036000830152614fba81614bc9565b9050919050565b60006020820190508181036000830152614fda81614c00565b9050919050565b6000602082019050614ff66000830184614c5d565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561501f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561504057600080fd5b602082029050919050565b600067ffffffffffffffff82111561506257600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600060ff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000615188826150c4565b9050919050565b82818337600083830152505050565b60005b838110156151bc5780820151818401526020810190506151a1565b838111156151cb576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a723058201d904c05f63ba52112957a0d935f6e57110355ba11f81a21e90d2922f4f370906c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPENING_BANK\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAllKeyType\",\"outputs\":[{\"name\":\"keyList\",\"type\":\"bytes[]\"},{\"name\":\"valList\",\"type\":\"bytes[]\"},{\"name\":\"retNum\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DATA\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"BALANCE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"RECORD\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PUB_KEY\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"caller\",\"type\":\"address\"},{\"name\":\"org\",\"type\":\"address\"},{\"name\":\"callee\",\"type\":\"address\"},{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"check2\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getNonceFromAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"checkAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ASSETS\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"addKeyType\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getInnerAccountAndStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getAccountManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ID\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"removeKeyType\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_PUBLIC\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"org\",\"type\":\"address\"},{\"name\":\"callee\",\"type\":\"address\"},{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"args\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"check2WithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getAuthManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"args\",\"type\":\"bytes\"},{\"name\":\"message\",\"type\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"checkNonce\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"caller\",\"type\":\"address\"},{\"name\":\"callee\",\"type\":\"address\"},{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"check\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"KEY_ALL\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"callee\",\"type\":\"address\"},{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"args\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"checkWithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"accountManagerAddr\",\"type\":\"address\"},{\"name\":\"authManagerAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"callerOrg\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"callee\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"calleeOrg\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"logCheck\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_ROLE_R = "ROLE_R";

    public static final String FUNC_OPENING_BANK = "OPENING_BANK";

    public static final String FUNC_GETALLKEYTYPE = "getAllKeyType";

    public static final String FUNC_ROLE_W = "ROLE_W";

    public static final String FUNC_DATA = "DATA";

    public static final String FUNC_OWNER = "OWNER";

    public static final String FUNC_BALANCE = "BALANCE";

    public static final String FUNC_RECORD = "RECORD";

    public static final String FUNC_PUB_KEY = "PUB_KEY";

    public static final String FUNC_ADMIN = "ADMIN";

    public static final String FUNC_MODE_R = "MODE_R";

    public static final String FUNC_CHECK2 = "check2";

    public static final String FUNC_TYPE_ADMIN = "TYPE_ADMIN";

    public static final String FUNC_TYPE_OWNER = "TYPE_OWNER";

    public static final String FUNC_GETNONCEFROMACCOUNT = "getNonceFromAccount";

    public static final String FUNC_MODE_W = "MODE_W";

    public static final String FUNC_OWNER_ADDR = "OWNER_ADDR";

    public static final String FUNC_CHECKACCOUNT = "checkAccount";

    public static final String FUNC_ASSETS = "ASSETS";

    public static final String FUNC_USER_ADDR = "USER_ADDR";

    public static final String FUNC_ADDKEYTYPE = "addKeyType";

    public static final String FUNC_USER = "USER";

    public static final String FUNC_GETOWNER = "getOwner";

    public static final String FUNC_OPERATOR = "OPERATOR";

    public static final String FUNC_ROLE = "ROLE";

    public static final String FUNC_GETINNERACCOUNTANDSTATUS = "getInnerAccountAndStatus";

    public static final String FUNC_ADMIN_ADDR = "ADMIN_ADDR";

    public static final String FUNC_GETACCOUNTMANAGER = "getAccountManager";

    public static final String FUNC_ID = "ID";

    public static final String FUNC_ADDR = "ADDR";

    public static final String FUNC_REMOVEKEYTYPE = "removeKeyType";

    public static final String FUNC_TYPE_PUBLIC = "TYPE_PUBLIC";

    public static final String FUNC_OPERATOR_ADDR = "OPERATOR_ADDR";

    public static final String FUNC_TYPE = "TYPE";

    public static final String FUNC_CHECK2WITHSIGN = "check2WithSign";

    public static final String FUNC_GETAUTHMANAGER = "getAuthManager";

    public static final String FUNC_CHECKNONCE = "checkNonce";

    public static final String FUNC_CHECK = "check";

    public static final String FUNC_KEY_ALL = "KEY_ALL";

    public static final String FUNC_CHECKWITHSIGN = "checkWithSign";

    public static final Event LOGCHECK_EVENT = new Event("logCheck", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<DynamicBytes>() {}));
    ;

    protected AuthCenter(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public byte[] ROLE_R() throws ContractException {
        final Function function = new Function(FUNC_ROLE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] OPENING_BANK() throws ContractException {
        final Function function = new Function(FUNC_OPENING_BANK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Tuple3<List<byte[]>, List<byte[]>, BigInteger> getAllKeyType() throws ContractException {
        final Function function = new Function(FUNC_GETALLKEYTYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<DynamicBytes>>() {}, new TypeReference<DynamicArray<DynamicBytes>>() {}, new TypeReference<Uint256>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple3<List<byte[]>, List<byte[]>, BigInteger>(
                convertToNative((List<DynamicBytes>) results.get(0).getValue()), 
                convertToNative((List<DynamicBytes>) results.get(1).getValue()), 
                (BigInteger) results.get(2).getValue());
    }

    public byte[] ROLE_W() throws ContractException {
        final Function function = new Function(FUNC_ROLE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] DATA() throws ContractException {
        final Function function = new Function(FUNC_DATA, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] OWNER() throws ContractException {
        final Function function = new Function(FUNC_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] BALANCE() throws ContractException {
        final Function function = new Function(FUNC_BALANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] RECORD() throws ContractException {
        final Function function = new Function(FUNC_RECORD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] PUB_KEY() throws ContractException {
        final Function function = new Function(FUNC_PUB_KEY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADMIN() throws ContractException {
        final Function function = new Function(FUNC_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] MODE_R() throws ContractException {
        final Function function = new Function(FUNC_MODE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Boolean check2(String caller, String org, String callee, byte[] key) throws ContractException {
        final Function function = new Function(FUNC_CHECK2, 
                Arrays.<Type>asList(new Address(caller), 
                new Address(org), 
                new Address(callee), 
                new DynamicBytes(key)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public byte[] TYPE_ADMIN() throws ContractException {
        final Function function = new Function(FUNC_TYPE_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_OWNER() throws ContractException {
        final Function function = new Function(FUNC_TYPE_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public BigInteger getNonceFromAccount(String account) throws ContractException {
        final Function function = new Function(FUNC_GETNONCEFROMACCOUNT, 
                Arrays.<Type>asList(new Address(account)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public byte[] MODE_W() throws ContractException {
        final Function function = new Function(FUNC_MODE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String OWNER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OWNER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public Boolean checkAccount(String account) throws ContractException {
        final Function function = new Function(FUNC_CHECKACCOUNT, 
                Arrays.<Type>asList(new Address(account)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public byte[] ASSETS() throws ContractException {
        final Function function = new Function(FUNC_ASSETS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String USER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_USER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt addKeyType(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADDKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addKeyType(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddKeyType(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADDKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key), 
                new DynamicBytes(value)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getAddKeyTypeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADDKEYTYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getAddKeyTypeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDKEYTYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] USER() throws ContractException {
        final Function function = new Function(FUNC_USER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt getOwner() {
        final Function function = new Function(
                FUNC_GETOWNER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getOwner(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETOWNER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetOwner() {
        final Function function = new Function(
                FUNC_GETOWNER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetOwnerOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETOWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public byte[] OPERATOR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ROLE() throws ContractException {
        final Function function = new Function(FUNC_ROLE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Tuple2<String, Boolean> getInnerAccountAndStatus(String account) throws ContractException {
        final Function function = new Function(FUNC_GETINNERACCOUNTANDSTATUS, 
                Arrays.<Type>asList(new Address(account)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Bool>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple2<String, Boolean>(
                (String) results.get(0).getValue(), 
                (Boolean) results.get(1).getValue());
    }

    public String ADMIN_ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADMIN_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt getAccountManager() {
        final Function function = new Function(
                FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getAccountManager(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetAccountManager() {
        final Function function = new Function(
                FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetAccountManagerOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public byte[] ID() throws ContractException {
        final Function function = new Function(FUNC_ID, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt removeKeyType(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVEKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void removeKeyType(byte[] key, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REMOVEKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRemoveKeyType(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVEKEYTYPE, 
                Arrays.<Type>asList(new DynamicBytes(key)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<byte[]> getRemoveKeyTypeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REMOVEKEYTYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<byte[]>(

                (byte[]) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getRemoveKeyTypeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REMOVEKEYTYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] TYPE_PUBLIC() throws ContractException {
        final Function function = new Function(FUNC_TYPE_PUBLIC, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String OPERATOR_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] TYPE() throws ContractException {
        final Function function = new Function(FUNC_TYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Tuple2<String, Boolean> check2WithSign(String org, String callee, byte[] key, byte[] args, List<byte[]> sign) throws ContractException {
        final Function function = new Function(FUNC_CHECK2WITHSIGN, 
                Arrays.<Type>asList(new Address(org), 
                new Address(callee), 
                new DynamicBytes(key), 
                new DynamicBytes(args), 
                new org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))),
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Bool>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple2<String, Boolean>(
                (String) results.get(0).getValue(), 
                (Boolean) results.get(1).getValue());
    }

    public TransactionReceipt getAuthManager() {
        final Function function = new Function(
                FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getAuthManager(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetAuthManager() {
        final Function function = new Function(
                FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetAuthManagerOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public TransactionReceipt checkNonce(byte[] args, byte[] message, String account) {
        final Function function = new Function(
                FUNC_CHECKNONCE, 
                Arrays.<Type>asList(new DynamicBytes(args), 
                new Bytes32(message), 
                new Address(account)), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void checkNonce(byte[] args, byte[] message, String account, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_CHECKNONCE, 
                Arrays.<Type>asList(new DynamicBytes(args), 
                new Bytes32(message), 
                new Address(account)), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCheckNonce(byte[] args, byte[] message, String account) {
        final Function function = new Function(
                FUNC_CHECKNONCE, 
                Arrays.<Type>asList(new DynamicBytes(args), 
                new Bytes32(message), 
                new Address(account)), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], String> getCheckNonceInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_CHECKNONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<Bytes32>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], String>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                (String) results.get(2).getValue()
                );
    }

    public Tuple1<Boolean> getCheckNonceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_CHECKNONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public Boolean check(String caller, String callee, byte[] key) throws ContractException {
        final Function function = new Function(FUNC_CHECK, 
                Arrays.<Type>asList(new Address(caller), 
                new Address(callee), 
                new DynamicBytes(key)), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public byte[] KEY_ALL() throws ContractException {
        final Function function = new Function(FUNC_KEY_ALL, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public Tuple2<String, Boolean> checkWithSign(String callee, byte[] key, byte[] args, List<byte[]> sign) throws ContractException {
        final Function function = new Function(FUNC_CHECKWITHSIGN, 
                Arrays.<Type>asList(new Address(callee), 
                new DynamicBytes(key), 
                new DynamicBytes(args), 
                new org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray4<Bytes32>(
                        Utils.typeMap(sign, Bytes32.class))), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Bool>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple2<String, Boolean>(
                (String) results.get(0).getValue(), 
                (Boolean) results.get(1).getValue());
    }

    public List<LogCheckEventResponse> getLogCheckEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGCHECK_EVENT, transactionReceipt);
        ArrayList<LogCheckEventResponse> responses = new ArrayList<LogCheckEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogCheckEventResponse typedResponse = new LogCheckEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.caller = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.callerOrg = (String) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.callee = (String) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.calleeOrg = (String) eventValues.getNonIndexedValues().get(3).getValue();
            typedResponse.key = (byte[]) eventValues.getNonIndexedValues().get(4).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogCheckEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGCHECK_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogCheckEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGCHECK_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static AuthCenter load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new AuthCenter(contractAddress, client, credential);
    }

    public static AuthCenter deploy(Client client, CryptoKeyPair credential, String accountManagerAddr, String authManagerAddr) throws ContractException {
        String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.<Type>asList(new Address(accountManagerAddr), 
                new Address(authManagerAddr)));
        return deploy(AuthCenter.class, client, credential, getBinary(client.getCryptoSuite()), encodedConstructor);
    }

    public static class LogCheckEventResponse {
        public TransactionReceipt.Logs log;

        public String caller;

        public String callerOrg;

        public String callee;

        public String calleeOrg;

        public byte[] key;
    }
}
